package com.example.mysql.学习笔记.高级.数据库的优化之索引.索引的数据结构;

public class MyISAM引擎和InnoDB引擎索引区别 {
}
/**
 * MyISAM只有二级索引(非聚簇索引（不保存真实信息）)
 *
 * MyISAM弓|擎使用B+Tree作为索引结构，
 *   叶子节点的data域存放的是数据记录的地址
 *
 * 而  InnoDB的叶子节点
 *     聚簇索引存放的是记录
 *     非聚簇索引存放的是主键加非聚簇索引的索引列
 *
 *    MyISAM只缓存索引，不缓存真实数据;
 *    InnoDB不仅缓存索引还要缓存真实数据,对内存要求高  内存大小性能有决定性影响
 *
 *
 *   MyISAM的索引方式都是“非聚簇”的，与InnoDB包含1个聚簇索引是不同的。
 *   小结两种引擎中索引的区别:
 *     ①在InnoDB存储引擎中，我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录，
 *       而在MyISAM中却需要进行一次回表操作,意味着MyISAM中建立的索引相当于全部都是二级索引。
 *     ②InnoDB的数据文件本身就是索引文件，而MyISAM索弓|文件和数据文件是分离的，
 *       索引文件仅保存数据记录的地址。
 *     ③InnoDB的非聚簇索引data域存储相应记录主键的值，而MyISAM索引记录的是地址。
 *       换句话说，InnoDB的所有非聚簇索引都引用主键作为data域。
 *     ④MyISAM的回表操作是十分快速的，因为是拿着地址偏移量直接到文件中取数据的，
 *       反观InnoDB是 通过获取主键之后再去聚簇索引里找记录，虽然说也不慢，但还是比不上直接用地址去访问。
 *     ⑤InnoDB要求表必须有主键(MyISAM可以没有)。
 *       如果没有显式指定,则MySQL系统会自动选择一个可以非空且唯-标识数据记录的列作为主键。
 *       如果不存在这种列，则MySQL自动为InnoDB表生成一个隐含字段作为主键,
 *       这个字段长度为6个字节，类型为长整型。
 *
 *
 * 举例1:知道了InnoDB的索引实现后，就很容易明白为什么不建议使用过长的字段作为主键，
 * 因为所有二级索引都引用主键索引，过长的主键索引会令二级索引变得过大。
 *
 * 举例2:用非单调的字段作为主键在InnoDB中不是个好主意，
 * 因为InnoDB数据文件本身是-棵B+Tree, 非单调的主键会造成在插入新记录时，
 * 数据文件为了维持B+Tree的特性而频繁地分裂调整，
 * 十分低效，而使用自增字段作为主键则是一个很好的选择。
 *
 *
 */
